package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class Statistiques {

	/* Variables nécessaires à l'affichage */
	private Display display;
	private Shell shell;
	private Text text;
	private Text text_1;
	private Text text_2;
	private Table table;

	/**
	 * Constructeur de la classe, initialise uniquement
	 * l'écran à utiliser pour afficher la fenêtre
	 */
	public Statistiques(){
		this.display = MainApp.display;
	}

	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(){
		if(shell == null || shell.isDisposed())
			run();
		else{
			rafraichir();
			shell.setActive();
		}
	}

	/**
	 * Cette fonction a pour but d'initialiser la fenêtre.
	 * Elle se termine en l'affichant avec des valeurs mises
	 * à jour depuis la base de données.
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run(){
		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX);
		shell.setText("Statistiques");
		shell.setSize(678, 290);
		shell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent arg0) {
				MainApp.consult.setActive();
			}
		});
		shell.setImage(MainApp.icone);

		Label lblNombreTotalDe = new Label(shell, SWT.NONE);
		lblNombreTotalDe.setBounds(10, 13, 208, 15);
		lblNombreTotalDe.setText("Nombre total de commandes :");
		
		text = new Text(shell, SWT.BORDER);
		text.setEditable(false);
		text.setBounds(224, 10, 438, 21);
		
		Label lblPrixMoyenDes = new Label(shell, SWT.NONE);
		lblPrixMoyenDes.setBounds(10, 40, 208, 15);
		lblPrixMoyenDes.setText("Prix moyen des commandes :");
		
		text_1 = new Text(shell, SWT.BORDER);
		text_1.setEditable(false);
		text_1.setBounds(224, 37, 438, 21);
		
		text_2 = new Text(shell, SWT.BORDER);
		text_2.setEditable(false);
		text_2.setBounds(224, 64, 438, 21);
		
		Label lblMeilleurClient = new Label(shell, SWT.NONE);
		lblMeilleurClient.setBounds(10, 67, 208, 15);
		lblMeilleurClient.setText("Meilleur client :");
		
		table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.setBounds(10, 91, 652, 160);
		table.setHeaderVisible(true);
		
		TableColumn tblclmnPhoto = new TableColumn(table, SWT.NONE);
		tblclmnPhoto.setResizable(false);
		tblclmnPhoto.setWidth(647);
		tblclmnPhoto.setText("Photos commandées par tous les clients :");
		
		rafraichir();
		if(!shell.isDisposed())
			shell.open();
	}

	/**
	 * Cette fonction récupère met à jour les champs de la
	 * fenêtre avec les valeurs comprises dans la base de
	 * données
	 */	
	public void rafraichir(){
		if(!MainApp.estAdmin){
			shell.dispose();
			return;
		}
		table.removeAll();
		try {
			setNbCommandes();
			setPrixMoyenCommande();
			setMeilleurClient();
			setPhotoCommandeeParTousLesClients();
		} catch (SQLException e) {
			MainApp.erreurBase(e.getMessage());
		}
	}
	
	/**
	 * Récupère le nombre total de commandes
	 */
	public void setNbCommandes() throws SQLException{
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		ResultSet rset = stmt.executeQuery("SELECT COUNT(*) FROM Commande");
		if (rset.next()){
			text.setText(String.valueOf(rset.getInt(1)));
		}
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}
	
	/**
	 * Donne le prix moyen des commandes
	 */
	public void setPrixMoyenCommande() throws SQLException{
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		ResultSet rset = stmt.executeQuery("SELECT AVG(prixTotal) FROM (SELECT SUM(prixParTirage*quantite) AS prixTotal FROM LigneCommande GROUP BY idCommande)");
		if (rset.next()){
			text_1.setText(String.valueOf(rset.getInt(1)) + " €");
		}
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}
	
	/**
	 * Affiche le meilleur client (celui qui a le plus
	 * dépensé au total dans toutes ses commandes)
	 */
	public void setMeilleurClient() throws SQLException{
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");

		// Requête d'un tableau de dépenses totales trié, et on ne prend que la première ligne :
		String req = "SELECT prenom, nom, SUM(quantite*prixParTirage) AS depense FROM LigneCommande, Commande, Client" +
				    " WHERE LigneCommande.idCommande = Commande.idCommande" +
				    " AND Commande.idClient = Client.idClient" +
				    " GROUP BY nom, prenom" +
				    " ORDER BY depense DESC";
		ResultSet rset = stmt.executeQuery(req);
		if (rset.next()){
			text_2.setText(rset.getString(1).concat(" " + rset.getString(2)));
		} else {
			text_2.setText("Pas de commandes enregistrée...");
		}
		
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}
	
	/**
	 * Affiche les photos commandées par tous les clients (ceux qui commandent)
	 * On utilise pour cela une division de tables.
	 */
	public void setPhotoCommandeeParTousLesClients() throws SQLException{
		Statement stmt = JDBC.getInstance().getStatement();
		stmt.executeUpdate("SET TRANSACTION READ ONLY");
		String req = "SELECT chemin FROM Photo a "
					+"WHERE NOT EXISTS ("
					+"	SELECT * FROM Commande b"
					+"	WHERE NOT EXISTS ("
					+"		SELECT Commande.idClient, Contient.idPhoto FROM"
					+"		Commande, LigneCommande, Album, Contient"
					+"		WHERE b.idClient = Commande.idClient"
					+"		AND Commande.idCommande = LigneCommande.idCommande"
					+"		AND LigneCommande.idAlbum = Album.idAlbum"
					+"		AND Album.idAlbum = Contient.idAlbum"
					+"		AND Contient.idPhoto = a.idPhoto"
					+"	)"
					+") ORDER BY chemin";
		ResultSet rset = stmt.executeQuery(req);
		while(rset.next()){
			TableItem tableItem = new TableItem(table, SWT.NONE);
			tableItem.setText(rset.getString(1));
		}
		stmt.executeUpdate("COMMIT");
		rset.close();
		stmt.close();
	}

	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
}
